/*
 * main.c
 *
 *  Created on: 28.10.2012
 *      Author: Anton_Lilik
 */


#include "mot823111.h"
#include "sndMsg.h"

int Dir1 = 0;

uint8_t tmp = 0;



void main()
{
    //
    uint8_t tmp = 0;
    uint8_t LightOn = 0;
    uint8_t OldBtnB = 0;

    uint16_t Speed = 0;
    //uint16_t CristalTemp = 0;

    //uint16_t MAX_VAL = 1024;
    uint16_t STOP_VAL = 512;

    //SetupClock();	// пока что-то не работает, то есть работаем на 8 МГц внутреннем RC

    SetPeriphClock();
    InitPeriph();
    M1_Init();
    M2_Init();
    MAdc_InitDMA();
    ENDs_Init();
    SetP_Init();

    M1_Set(M_Stop, 0 ); // stop
    M2_Set(M_Stop, 0 ); // stop

    // проверка напряжения на батарее
    // если меньше порора
    	// издать жалобный писк и зациклиться (поможет только рестарт при заряженной батарее)


    OldBtnB = ENDB();	// начальное значение состояние кнопки при старте

    if(OldBtnB == 1)	// если была нажата кнопка то нужно провести калибровку резистора Б
    {
    	// Зажечь светодиод В
    	OnLEDB();
    	//Delay((8E+6)); // период 1 секунда (как буддто калибровка)

    	// подать голос
    	// сделать несколько измерений в ноле
    	// запомнить максимальное и минимальное

    	// подать голос
    	// сделать несколько измерений в максимуме
    	// запомнить максимальное или среднее

    	// подать голос
    	// сделать несколько измерений в ноле
    	// запомнить максимальное и минимальное

    	// подать голос
    	// сделать несколько измерений в минимуме
    	// запомнить максимальное или среднее

    	// на основе этих измерений задать значения для констант
    	// провести анализ результатов на правильность
    	// если удача то
    		// пропеть мелодию что удача
    		// сохранить их в энергонезависемую памать
    	// иначе
    		// сообщить о неудаче (грустная мелодия)
    	// погасить светодиод В
    	OffLEDB();

    }

    OldBtnB = ENDB();

    while(1)
    {
    	// проверить нажатие кнопок
    	// если нажата кнопка СИГНАЛ
    		// включить сигнал один раз (что бы нельзя было зажать кнопку)
    	// если нажата кнопка СВЕТ
    		// если свет не включен
    			// включить свет
    		// иначе
    			// выключить свет

    	// управление мотором:
    	// в чистовом варианте необходимо реализовать некий механизм защиты
    	// пилота от самого себя Для этого необходимо иметь датчик скорости вращения колеса
    	// и в зависисмости от его показаний менять тягу плавно.
    	// То есть нельзя резко сделать реверс мотора
    	// необходимо вначале снизить скорость до нуля, например торможением, а затем включить реверс
    	// но это уже следующий шаг. Для начала сделаем по простому

    	// смотрим на значение резистора ГАЗ
    	// вычисляем направление и скорость
    	// если меняем направление движения
    		// переключаем соответствующим образом освещение
    	// меняем параметры работы мотора



    	// BTNB logic
        tmp = ENDB();
        if(tmp != OldBtnB)			// если значение изменилось
        {
            if(tmp == 1)			// и новое значение ровно 1
            {
                // do on Hi
                if(LightOn == 0)		// если прежнее состояние ВЫКЛ
                {
                    LightOn = 1;			// меняем состояние и
                    OnLEDB();				// включаем
                }
                else					// ели было ВКЛ
                {
                    LightOn = 0;			// меняем состояние и
                    OffLEDB();				// отключаем
                }


            }
            else
            {
                // do on Low

            }
            OldBtnB = tmp;
        }


        // set engine speed
        Speed = AnalogInputs[M_ADC_SIGB]>>2;     // read ADC channel SIGB
        if(Speed > STOP_VAL)
        {
            M1_Set(M_Left, (uint16_t)((Speed-STOP_VAL)*2) );
            OnLEDA();
        }
        else
        {
            M1_Set(M_Right , (uint16_t)((STOP_VAL-Speed)*2) );
            OffLEDA();
        }

        //Delay((1E+6)); // период 1/8 секунда


    }
}

